package com.example.handler;

import com.example.enums.ResultEnum;
import com.example.utils.ResultVO;
import com.example.utils.ResultVOUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @author 路飞
 * @date 2018-12-12
 * @description 全局异常处理: 使用 @RestControllerAdvice + @ExceptionHandler 注解方式实现全局异常处理
 *
 *  注意：@RestControllerAdvice 和  @ControllerAdvice。  区别就是 @RestControllerAdvice多了一个 @ResponseBody注解，
 *      如果全部异常处理返回json，那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ，这样在方法上就可以不需要
 *      添加 @ResponseBody。
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    private final Logger logger = LogManager.getLogger(GlobalExceptionHandler.class);

    /**
     *@description 处理所有不可知的异常(系统异常)
     */
    @ExceptionHandler({Exception.class})
    public ResultVO systemException(Exception e) {
        this.logger.error(e.getMessage(), e);
        return ResultVOUtil.error(ResultEnum.OPERATE_FAIL);
    }

    /**
     *@description 处理自定义的业务异常
     *  BaseException 类继承 RuntimeException
     */
    @ExceptionHandler({BaseException.class})
    public ResultVO businessException(BaseException e) {
        this.logger.error(e.getMessage(), e);
        return ResultVOUtil.error(e.getCode(), e.getMessage());
    }
}
